/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "矢量绘图着色材质.h"
#include "core/引擎配置.h"
#include "core/shader_built_in_functions.h"
#include "底层绘图/intern/绘图框架.h"
#include "底层绘图/intern/Vulkan/Vulkan框架.h"
#include "底层绘图/底层绘图框架.h"
#include "UI/Widget.h"




//S_材质管线* f_初始化边缘阴影材质(S_设备环境& Ctx, E_MS次数 采样) {
//	S_材质管线* 材质 = f_create基本材质(E_基本材质类型::e_单色材质, "a");
//	
//	S_着色器创建配置 图元配置 = {
//		{
//			{0, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},
//			{1, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},
//			{2, E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},
//			{3, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},
//
//		},
//		{
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//		},
//		{
//			{S_引擎配置::m_UI着色器文件根路径 + "UI描边阴影_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
//			{S_引擎配置::m_UI着色器文件根路径 + "UI描边阴影_几何阶段.spv", {}, E_着色阶段::e_几何着色},
//			{S_引擎配置::m_UI着色器文件根路径 + "UI单色_片源阶段.spv", {}, E_着色阶段::e_像素着色},
//		}
//	};
//
//	S_线管创建参数 线管参数({ 1024, 576 });
//	线管参数.m_绘制方式 = E_绘制方式::e_画邻接连续线段;
//	线管参数.m_填充模式 = E_填充模式::e_填充面;
//	线管参数.m_采样 = 采样;
//
//	材质 = new S_材质管线();
//	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
//	return 材质;
//}

//S_材质管线* f_初始化线阴影材质(S_设备环境& Ctx, E_MS次数 采样) {
//	return nullptr;
//}

//S_材质管线* f_初始化条纹材质(S_设备环境& Ctx, E_MS次数 采样) {
//	S_着色器创建配置 图元配置 = {
//		{
//			{0, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},		//投影
//			{1, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},		//属性
//			{2, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},	//变换
//		    {3, E_着色阶段::e_像素着色, E_板载缓存类型::e_SSBO},	//颜色
//		    {DEF_BINDING_WIDGET_LineProp, E_着色阶段::e_像素着色, E_板载缓存类型::e_SSBO},	//颜色
//		},
//		{
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//		},
//		{
//			{S_引擎配置::m_UI着色器文件根路径 + "UI条纹_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
//			{S_引擎配置::m_UI着色器文件根路径 + "UI条纹_片源阶段.spv", {}, E_着色阶段::e_像素着色},
//		}
//	};
//	S_线管创建参数 线管参数({ 1024, 576 });
//	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
//	线管参数.m_填充模式 = E_填充模式::e_填充面;
//	线管参数.m_采样 = 采样;
//	线管参数.m_槽 = E_管线槽::e_UI渲染;
//	
//	S_材质管线* 材质 = new S_材质管线();
//	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
//	return 材质;
//}

S_材质管线* f_初始化外部纹理材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_材质管线* 材质 = f_create基本材质(E_基本材质类型::e_单色材质, "a");

	S_着色器创建配置 图元配置 = {
		{
			{0, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{1, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{2, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},

			{10, E_着色阶段::e_像素着色, E_板载缓存类型::e_IMAGE_SAMPLER},
		},
		{
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI纹理填充_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI单纹理_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_三角形带;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;


	材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_初始化网格刻度线材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_材质管线* 材质 = f_create基本材质(E_基本材质类型::e_单色材质, "a");

	S_着色器创建配置 图元配置 = {
		{
			{DEF_BINDING_PROJECT,       E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_PROP,   E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_MATRIX, E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},
			{DEF_BINDING_WIDGET_Color,  E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		    {0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		    {0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI网格刻度_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI网格刻度_几何阶段.spv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI纵向刻度_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};
	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_初始化单纹理材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_材质管线* 材质 = f_create基本材质(E_基本材质类型::e_单色材质, "a");

	S_着色器创建配置 图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_PROP, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_MATRIX, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},
			
			{DEF_BINDING_WIDGET_Texture, E_着色阶段::e_像素着色, E_板载缓存类型::e_IMAGE_SAMPLER},
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI纹理_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI纹理_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_初始化多纹理材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_着色器创建配置 图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_PROP, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
			{DEF_BINDING_WIDGET_MATRIX, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},

			{DEF_BINDING_WIDGET_TextureID, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},

			{DEF_BINDING_WIDGET_Texture, E_着色阶段::e_像素着色, E_板载缓存类型::e_SAMPLER_Array},
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI多纹理_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI多纹理_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		},
		{
			{ E_着色阶段::e_顶点着色, 0, sizeof(S_MulTex_ConstPush)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	S_材质管线* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

//S_材质管线* f_初始化间接绘制_单色图标材质(S_设备环境& Ctx, E_MS次数 采样) {
//	S_着色器创建配置 图元配置;
//
//	S_线管创建参数 线管参数({ 1024, 576 });
//	图元配置 = {
//		{
//			{DEF_BINDING_PROJECT,		E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
//			{DEF_BINDING_WIDGET_PROP,	E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},
//			{DEF_BINDING_WIDGET_MATRIX, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},
//			{DEF_BINDING_WIDGET_Color,	E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},
//
//			{DEF_BINDING_WIDGET_Texture, E_着色阶段::e_像素着色, E_板载缓存类型::e_IMAGE_SAMPLER},
//		},
//		{
//		},
//		{
//			{S_引擎配置::m_UI着色器文件根路径 + "UI图标_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
//			{S_引擎配置::m_UI着色器文件根路径 + "UI图标_片源阶段.spv", {}, E_着色阶段::e_像素着色},
//		}
//	};
//	//auto* Shader = f_create着色(Ctx, 图元配置);
//	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
//	线管参数.m_填充模式 = E_填充模式::e_填充点;
//	线管参数.m_采样 = 采样;
//	线管参数.m_槽 = E_管线槽::e_UI渲染;
//
//	auto* 材质 = new S_材质管线();
//	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
//	return 材质;
//}

S_材质管线* f_初始化_动态线材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_着色器创建配置 图元配置;

	S_线管创建参数 线管参数({ 1024, 576 });

	图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},			//视图矩阵
			{DEF_BINDING_WIDGET_PROP, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},		//画布属性
			{DEF_BINDING_WIDGET_MATRIX, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},	//变换矩阵
			{DEF_BINDING_WIDGET_Color, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},		//颜色
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI动态线_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI动态线_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	//auto* Shader = f_create着色(Ctx, 图元配置);

	线管参数.m_绘制方式 = E_绘制方式::e_画连续线;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	auto* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_创建线管_曲线点材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_着色器创建配置 图元配置;

	S_线管创建参数 线管参数({ 1024, 576 });

	图元配置 = {
		{
			{0, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},			//视图矩阵
			{1, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},			//画布属性
			{3, E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},		//颜色
			{4, E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},		//曲线
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI曲线_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI曲线点_几何阶段.spv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI点_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充点;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	auto* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_创建线管_曲线材质(S_设备环境& Ctx, E_MS次数 采样, bool 多曲线) {
	S_着色器创建配置 图元配置;

	S_线管创建参数 线管参数({ 1024, 576 });

	std::string 着色器路径;
	if (多曲线) {
		着色器路径 = S_引擎配置::m_UI着色器文件根路径 + "UI多曲线_几何阶段.spv";
	}
	else {
		着色器路径 = S_引擎配置::m_UI着色器文件根路径 + "UI曲线_几何阶段.spv";
	}

	图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},				//视图矩阵
			{DEF_BINDING_WIDGET_PROP, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},			//画布属性
			{DEF_BINDING_WIDGET_CurvePoint, E_着色阶段::e_几何着色, E_板载缓存类型::e_SSBO},	//曲线
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI曲线_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
			{着色器路径, {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI动态线_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	auto* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

//S_材质管线* f_初始化_色轮材质(S_设备环境& Ctx, E_MS次数 采样) {
//	S_着色器创建配置 图元配置;
//
//	S_线管创建参数 线管参数({ 1024, 576 });
//
//	图元配置 = {
//		{
//			{DEF_BINDING_PROJECT,         E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},   //视图矩阵
//			{DEF_BINDING_WIDGET_PROP,     E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},   //画布属性
//			{DEF_BINDING_WIDGET_MATRIX,   E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},	//变换矩阵
//			{DEF_BINDING_WIDGET_Color,    E_着色阶段::e_像素着色, E_板载缓存类型::e_SSBO},	//颜色
//			{DEF_BINDING_WIDGET_LineProp, E_着色阶段::e_像素着色, E_板载缓存类型::e_SSBO},  //渐变
//		},
//		{
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
//		},
//		{
//			{S_引擎配置::m_UI着色器文件根路径 + "UI色轮_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
//			{S_引擎配置::m_UI着色器文件根路径 + "UI色轮_片源阶段.spv", {}, E_着色阶段::e_像素着色},
//		}
//	};
//
//	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
//	线管参数.m_填充模式 = E_填充模式::e_填充面;
//	线管参数.m_采样 = 采样;
//	线管参数.m_启用深度测试 = false;
//	线管参数.m_启用写入深度 = true;
//	线管参数.m_槽 = E_管线槽::e_UI渲染;
//
//	auto* 材质 = new S_材质管线();
//	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
//	return 材质;
//}



S_材质管线* f_创建线管_表格线材质(S_设备环境& Ctx, E_MS次数 采样, E_填充模式 填充模式, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_材质管线* 材质 = new S_材质管线();

	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_Proj);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_WidgetTranform);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_CFS_L4_LayerArea);

	S_线管创建参数 线管参数({ 1024, 576 });

	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI曲线_顶点阶段.spv", {}, E_着色阶段::e_顶点着色},
		    {S_引擎配置::m_UI着色器文件根路径 + "UI网格线_几何阶段.spv", {}, E_着色阶段::e_几何着色},
		    {S_引擎配置::m_UI着色器文件根路径 + "UI动态线_片源阶段.spv", {}, E_着色阶段::e_像素着色},
		}
	};

	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = 填充模式;
	线管参数.m_采样 = 采样;

	f_df_设置线管混合模式(线管参数, 混合模式);

	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);
	return 材质;
}


S_材质管线* f_初始化_线段材质(S_设备环境& Ctx, E_图层混合模式 混合模式, E_MS次数 采样) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_直线.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_直线.gspv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_直线.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_2DPolygonElement)},
		}
	};

	

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画线段;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	
	S_结构对象* layout[3] = { 
		rf->m_管线参数设置_VS_Proj, 
		rf->m_管线参数设置_VS_WidgetTranform, 
		rf->m_管线参数设置_VS_WidgetColor };
	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;

	S_材质管线* 材质 = new S_材质管线();
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 3, mask);
	return 材质;
}

S_材质管线* f_初始化_图标材质(S_设备环境& Ctx, E_MS次数 采样) {
	S_着色器创建配置 图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_顶点着色, E_板载缓存类型::e_UBO},	//投影
			{1, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},					//变换
			{DEF_BINDING_WIDGET_Texture,   E_着色阶段::e_像素着色, E_板载缓存类型::e_SAMPLER_Array},
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(uvec2),0,E_数据格式::e_UI_R32G32},
			{0,sizeof(uvec2),0,E_数据格式::e_UI_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_图标.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_图标.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_2DICO_PanelAttr)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充点;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	S_材质管线* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_初始化_刻度线材质(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI刻度线.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI刻度线.gspv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI刻度线.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_TickMark)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_结构对象* layout[3] = {	
		rf->m_管线参数设置_VS_Proj, 
		rf->m_管线参数设置_VS_WidgetTranform, 
		rf->m_管线参数设置_VS_WidgetColor,
	};
	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;

	S_材质管线* 材质 = new S_材质管线();
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 3, mask);
	return 材质;
}

S_材质管线* f_初始化_波形材质(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	S_着色器创建配置 图元配置 = {
		{
			{DEF_BINDING_PROJECT, E_着色阶段::e_几何着色, E_板载缓存类型::e_UBO},	//投影矩阵
			{1, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},					//变换矩阵
			{2, E_着色阶段::e_顶点着色, E_板载缓存类型::e_SSBO},					//波形属性
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(uvec2),0,E_数据格式::e_UI_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI波形.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI波形.gspv", {}, E_着色阶段::e_几何着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI波形.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Waveform)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_填充模式 = E_填充模式::e_填充线;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线();
	f_df_创建材质着色器(Ctx, 材质, 图元配置, 线管参数);
	return 材质;
}

S_材质管线* f_初始化_纹理图像材质(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_纹理图像.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_纹理图像.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Textures)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_采样 = 采样;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_结构对象* layout[5] = {	
		rf->m_管线参数设置_VS_Proj, 
		rf->m_管线参数设置_VS_WidgetTranform, 
		rf->m_管线参数设置_VS_WidgetColor,
		rf->m_管线参数设置_VS_WidgetConvexRect, 
		rf->m_管线参数设置_FS_Textures, 
	};

	S_材质管线* 材质 = new S_材质管线();
	uint32 mask = E_管线槽::e_UI渲染 ;
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 5, mask);
	return 材质;
}

S_材质管线* f_创建线管_多边形线管(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_多边形面.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_多边形面.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_2DPolygonElement)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_三角形;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线();

	S_结构对象* layout[3] = { rf->m_管线参数设置_VS_Proj, 
								rf->m_管线参数设置_VS_WidgetTranform, 
								rf->m_管线参数设置_VS_WidgetColor };
	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 3, mask);
	return 材质;
}

S_材质管线* f_创建线管_图像线管(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI单纹理.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI单纹理.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_Texture)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });
	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_采样 = 采样;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	S_材质管线* 材质 = new S_材质管线();

	std::vector<S_着色器创建参数> 参数布局 = {
		{ 0,	E_着色阶段::e_像素着色, E_板载缓存类型::e_None},
	};
	auto g_参数布局 = f_df_创建着色器参数布局(f_df_getVK设备(Ctx), 参数布局, nullptr);
	S_结构对象* layout[4] = {	rf->m_管线参数设置_VS_Proj, 
								rf->m_管线参数设置_VS_WidgetTranform, 
								rf->m_管线参数设置_VS_WidgetColor,
								rf->m_管线参数设置_FS_1Tex};

	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 4, mask);
	return 材质;
}



S_材质管线* f_创建线管_凸包图元(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式, E_填充模式 填充模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_着色器创建配置 图元配置 = {
		{
		},
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_凸包图元.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_凸包图元.fspv", {}, E_着色阶段::e_像素着色},
		},
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_2DConvexElement_PanelAttr)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = 填充模式;
	线管参数.m_采样 = 采样;
	线管参数.m_启用深度测试 = false;
	线管参数.m_启用写入深度 = true;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	switch (填充模式) {
		case E_填充模式::e_填充面: {
			线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
			break;
		}
		case E_填充模式::e_填充线: {
			线管参数.m_绘制方式 = E_绘制方式::e_画连续线;
			break;
		}
		default:
			break;
	}

	f_df_设置线管混合模式(线管参数, 混合模式);


	S_结构对象* layout[4] = {	rf->m_管线参数设置_VS_Proj, 
								rf->m_管线参数设置_VS_WidgetTranform, 
								rf->m_管线参数设置_VS_WidgetColor,
								rf->m_管线参数设置_VS_WidgetConvexRect,
							};

	S_材质管线* 材质 = new S_材质管线();
	uint32 mask = E_管线槽::e_UI渲染 | E_管线槽::e_UI合成;
	f_df_创建材质管线(Ctx, 材质, 图元配置, 线管参数, layout, 4, mask);
	return 材质;
}

S_材质管线* f_创建线管_UI图像合成(S_设备环境& Ctx, E_MS次数 采样, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_材质管线* 材质 = new S_材质管线();

	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_Proj);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_WidgetTranform);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_CFS_L4_LayerArea);


	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_图层合成.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_图层合成.fspv", {}, E_着色阶段::e_像素着色},
		},
		材质->m_着色参数布局,
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_TAA)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_绘制方式 = E_绘制方式::e_画扇形;
	线管参数.m_采样 = 采样;
	线管参数.m_槽 = E_管线槽::e_UI渲染;

	f_df_设置线管混合模式(线管参数, 混合模式);

	//S_结构对象* layout[5] = {	
	//	rf->m_管线参数设置_VS_Proj, 
	//	rf->m_管线参数设置_VS_WidgetTranform, 
	//	rf->m_管线参数设置_None, 
	//	rf->m_管线参数设置_FS_ImageArray,
	//	rf->m_管线参数设置_FS_TAA, 
	//};

	uint32 mask = E_管线槽::e_UI合成;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);
	return 材质;
}

S_材质管线* f_创建线管_UI渲染合成(S_设备环境& Ctx, E_图层混合模式 混合模式) {
	auto* rf = f_vk_get绘图框架(Ctx);

	S_材质管线* 材质 = new S_材质管线();

	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_Proj);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_VS_WidgetTranform);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	材质->m_着色参数布局.push_back(rf->m_着色布局设置_CFS_L4_SampleTAA);


	S_着色器管线创建参数 图元配置 = {
		{
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
			{0,sizeof(vec2),0,E_数据格式::e_F_R32G32},
		},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_合成.vspv", {}, E_着色阶段::e_顶点着色},
			{S_引擎配置::m_UI着色器文件根路径 + "UI_合成.fspv", {}, E_着色阶段::e_像素着色},
		},
		材质->m_着色参数布局,
		{
			{E_着色阶段::e_顶点着色, 0, sizeof(S_ConstPush_TAA)},
		}
	};

	S_线管创建参数 线管参数({ 1024, 576 });

	线管参数.m_填充模式 = E_填充模式::e_填充面;
	线管参数.m_绘制方式 = E_绘制方式::e_画点集;
	线管参数.m_采样 = E_MS次数::e_MS_1;
	线管参数.m_槽 = E_管线槽::e_UI合成;

	f_df_设置线管混合模式(线管参数, 混合模式);

	uint32 mask = E_管线槽::e_UI合成;
	f_df_创建渲染着色管线(Ctx, 材质, 图元配置, 线管参数, mask);
	return 材质;
}

S_GPU计算* f_创建线管_场景图像合成(S_设备环境& ctx) {
	auto* rf = f_vk_get绘图框架(ctx);

	S_GPU计算* 管线 = new S_GPU计算(&ctx);

	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	//管线->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L4_TAA);

	S_着色器管线创建参数 图元配置 = {
		{},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "场景图像合成.cspv", {}, E_着色阶段::e_计算着色},
		},
		管线->m_着色参数布局,
		{
			{E_着色阶段::e_计算着色, 0, sizeof(S_ConstPush_ImageComposition)},
		}
	};

	管线->m_Shader		= f_df_创建计算着色管线(ctx, 图元配置);
	管线->m_Pipeline	= f_df_创建计算线管(ctx, *管线->m_Shader);

	return 管线;
}

S_GPU计算* f_创建线管_UI累计合成(S_设备环境& ctx) {
	auto* rf = f_vk_get绘图框架(ctx);

	S_GPU计算* 管线 = new S_GPU计算(&ctx);

	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_CFS_L4_LayerArea);

	S_着色器管线创建参数 图元配置 = {
		{},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_累计合成.cspv", {}, E_着色阶段::e_计算着色},
		},
		管线->m_着色参数布局,
		{
			{E_着色阶段::e_计算着色, 0, sizeof(S_ConstPush_TAA)},
		}
	};

	管线->m_Shader		= f_df_创建计算着色管线(ctx, 图元配置);
	管线->m_Pipeline	= f_df_创建计算线管(ctx, *管线->m_Shader);

	return 管线;
}

S_GPU计算* f_创建线管_UI图层模糊(S_设备环境& ctx) {
	auto* rf = f_vk_get绘图框架(ctx);

	S_GPU计算* 管线 = new S_GPU计算(&ctx);

	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_None);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_Comp_L3_ImageSampleArray);
	管线->m_着色参数布局.push_back(rf->m_着色布局设置_CFS_L4_SampleTAA);

	S_着色器管线创建参数 图元配置 = {
		{},
		{
			{S_引擎配置::m_UI着色器文件根路径 + "UI_图层模糊.cspv", {}, E_着色阶段::e_计算着色},
		},
		管线->m_着色参数布局,
		{
			{E_着色阶段::e_计算着色, 0, sizeof(S_ConstPush_TAA)},
	}
	};

	管线->m_Shader		= f_df_创建计算着色管线(ctx, 图元配置);
	管线->m_Pipeline	= f_df_创建计算线管(ctx, *管线->m_Shader);

	return 管线;
}








